package com.realtyreg.service;

import com.realtyreg.domain.entity.users.Profile;
import com.realtyreg.domain.entity.users.User;
import com.realtyreg.domain.entity.users.UserRole;
import com.realtyreg.service.form.Registration;

import java.util.List;

/**
 * @author Petro
 * @created 05.09.2012 22:06
 */
public interface UserService {

    /**
     * Найти пользователя по email
     * @param email email пользователя
     * @return Пользователь или null если пользователь не найден
     */
    User findByEmail(String email);

    /**
     * Найти пользователя по id
     * @param id    id пользователя
     * @return Пользователь
     */
    User findOne(Long id);

    /**
     * Возвращает всех пользователей
     * @return всех пользователей
     */
    List<User> findAll();

    /**
     * Проверяет не зарегистрирован ли уже пользователь под таким email
     * @param email email для проверки
     * @return true - уже есть пользователь
     */
    boolean userExists(String email);

    /**
     * Создает и сохраняет пользователя
     * @param registration Регистрация
     * @param roles роли принципала
     * @return Новый пользователь
     */
    User create(Registration registration, UserRole ... roles);

    /**
     * Сохраняет пользователя
     * @param user пользователь
     * @return Сохраненный пользователь
     */
    User save(User user);

    /**
     * Удаляет пользователя по id
     * @param id id пользователя
     */
    void delete(Long id);

    /**
     * Генерирует новый токен для сброса пароля и сохраняет его в БД
     * @param user Пользователь, для которого генерится токен
     * @return user
     */
    User createNewPasswordToken(User user);

    /**
     * Изменяет пароль на новый, предварительно хэшируя его passwordEncoder-ом
     * Также очищает confirmToken
     * @param user Пользователь, для которого меняется пароль
     * @param password Новый пароль
     * @return user
     */
    User saveNewPassword(User user, String password);

    /**
     * Возвращает профиль пользователя с указанным id
     * @param id    id пользователя (= id профиля)
     * @return Профиль
     */
    public Profile findProfile(Long id);

    /**
     * Обновляет профиль пользователя
     * @param profile    профиль для сохранения
     * @return profile
     */
    public Profile updateProfile(Profile profile);
}
